package savet.gui.util;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import javax.swing.border.AbstractBorder;

/**
 * Classe criada para desenhar borda em componentes Swing. <br/><br/>
 * Nessa classe, sera gerada uma borda de linha onde a largura das linhas
 * superior, inferior, direita e esquerda poder&atilde;o ser customizadas, ou seja,
 * s&atilde;o independentes.
 *
 *
 * @author Adisson Marinho
 */
public class BordaLinhaCustomizada extends AbstractBorder {

    /**
     * Define uma largura padr&atilde;o para as linhas de 1 pixel.
     */
    public static final double LARGURA_PADRAO = 1;
    private Color corLinha;
    private double larguraSuperior;
    private double larguraEsquerda;
    private double larguraInferior;
    private double larguraDireita;
    private Component component = null;

    public BordaLinhaCustomizada() {
        this(Color.black);
    }

    public BordaLinhaCustomizada(Color color) {
        this(color, LARGURA_PADRAO, LARGURA_PADRAO, LARGURA_PADRAO, LARGURA_PADRAO);
    }

    public BordaLinhaCustomizada(Color color, double larguraLinhas) {
        this(color, larguraLinhas, larguraLinhas, larguraLinhas, larguraLinhas);
    }

    public BordaLinhaCustomizada(double superior, double esquerda, double inferior, double direita) {
        this(Color.black, superior, esquerda, inferior, direita);
    }

    public BordaLinhaCustomizada(Color color, double superior, double esquerda, double inferior, double direita) {
        this.corLinha = color;
        this.larguraSuperior = superior;
        this.larguraEsquerda = esquerda;
        this.larguraInferior = inferior;
        this.larguraDireita = direita;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {

        if (component == null) {
            this.component = c;
        }

        g.setColor(corLinha);
        desenharLinhaSuperior(g, width);
        desenharLinhaEsquerda(g, height);
        desenharLinhaInferior(g, height, width);
        desenharLinhaDireita(g, width, height);

    }

    /**
     * Metodo responsavel por desenhar linha direita.
     * @param g
     * @param width
     * @param height
     */
    protected void desenharLinhaDireita(Graphics g, int width, int height) {
        // direita
        Graphics2D g2d = (Graphics2D) g;
        g2d.fill(new Rectangle2D.Double(width - larguraDireita, 0, larguraDireita, height - LARGURA_PADRAO));
    }

    /**
     * Metodo responsavel por desenhar linha inferior.
     * @param g
     * @param width
     * @param height
     */
    protected void desenharLinhaInferior(Graphics g, int height, int width) {
        // inferior
        Graphics2D g2d = (Graphics2D) g;
        g2d.fill(new Rectangle2D.Double(0, height - larguraInferior, width - LARGURA_PADRAO, larguraInferior));
    }

    /**
     * Metodo responsavel por desenhar linha esquerda.
     * @param g
     * @param width
     * @param height
     */
    protected void desenharLinhaEsquerda(Graphics g, int height) {
        // esquerda
        Graphics2D g2d = (Graphics2D) g;
        g2d.fill(new Rectangle2D.Double(0, 0, larguraEsquerda, height - LARGURA_PADRAO));
    }

    /**
     * Metodo responsavel por desenhar linha superior.
     * @param g
     * @param width
     * @param height
     */
    protected void desenharLinhaSuperior(Graphics g, int width) {
        // superior
        Graphics2D g2d = (Graphics2D) g;
        g2d.fill(new Rectangle2D.Double(0, 0, width - LARGURA_PADRAO, larguraSuperior));
    }

    protected void repaint() {
        if (component != null) {
            component.repaint();
        }
    }

    public double getLarguraDireita() {
        return larguraDireita;
    }

    public void setLarguraDireita(double larguraDireita) {
        this.larguraDireita = larguraDireita;
        repaint();
    }

    public double getLarguraEsquerda() {
        return larguraEsquerda;
    }

    public void setLarguraEsquerda(double larguraEsquerda) {
        this.larguraEsquerda = larguraEsquerda;
        repaint();
    }

    public double getLarguraInferior() {
        return larguraInferior;
    }

    public void setLarguraInferior(double larguraInferior) {
        this.larguraInferior = larguraInferior;
        repaint();
    }

    public double getLarguraSuperior() {
        return larguraSuperior;
    }

    public void setLarguraSuperior(double larguraSuperior) {
        this.larguraSuperior = larguraSuperior;
        repaint();
    }

    public Color getCorLinha() {
        return corLinha;
    }
    /*
    public static void main(String[] args) {

        JFrame f = new JFrame("Teste");
        f.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
        JPanel p1 = new JPanel();
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();
        JPanel p4 = new JPanel();

        p1.setPreferredSize(new Dimension(100, 100));
        p2.setPreferredSize(new Dimension(100, 100));
        p3.setPreferredSize(new Dimension(100, 100));
        p4.setPreferredSize(new Dimension(100, 100));

        final BordaLinhaCustomizada bordaCustomizada = new BordaLinhaCustomizada(Color.gray);
        bordaCustomizada.setLarguraDireita(1);

        p1.setBorder(bordaCustomizada);
        p2.setBorder(new LineBorder(Color.gray));
        p4.setBorder(bordaCustomizada);
        p3.setBorder(new LineBorder(Color.gray));

        f.add(p1);
        f.add(p2);
        f.add(p3);
        f.add(p4);

        f.setSize(220, 400);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

    }
    */
}
